Providing low-cost, effective, and correct optimizations for speeding up applications has always been a challenge in computing systems. Traditionally, optimizations are performed at development time by the original developers and the final product is shipped to the client in the form of binary executables. Many advanced optimization techniques, however, are difficult to do statically at development time because of the lack of dynamic run-time information. In addition, many existing applications are no longer under development and therefore preclude any development time optimization.
Some dynamic translation and optimization tools have been developed which are capable of monitoring the run-time behavior of the application and changing the execution of the code by adding, removing, or changing the code during runtime. Such tools often have a number of limitations. The tools typically can only achieve a partial understanding of the run-time behavior of the application, and thus the extent of the tools' performance and applicability is often limited. Many optimizations require programmer knowledge and cannot be easily discovered by the tools. The overhead of obtaining behavior information often has significant impact on the performance of the program.